package ltd.bugs.cute.channel.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import ltd.bugs.cute.cache.CacheClient;
import ltd.bugs.cute.cache.CacheKeyUtil;
import ltd.bugs.cute.cache.callback.GetCallback;
import ltd.bugs.cute.channel.dao.ClientChannelConfigDAO;
import ltd.bugs.cute.channel.model.ClientChannelConfig;

@Service
public class ClientChannelConfigService {
  @Autowired
  private ClientChannelConfigDAO channelConfigDAO;
  public static final CacheKeyUtil keyUtil = new CacheKeyUtil(ClientChannelConfig.class);

  public void add(ClientChannelConfig channelConfig) {
    channelConfigDAO.add(channelConfig);
    // 删除缓存的列表通道
    deleteClientChannelConfigCache(channelConfig);
  }

  public void delete(long id) {
    ClientChannelConfig channelConfig = channelConfigDAO.get(id);
    channelConfigDAO.delete(id);
    // 删除缓存的列表通道
    deleteClientChannelConfigCache(channelConfig);
  }

  public void update(ClientChannelConfig channelConfig) {
    channelConfigDAO.update(channelConfig);
    // 删除缓存的列表通道
    deleteClientChannelConfigCache(channelConfig);
  }

  private void deleteClientChannelConfigCache(ClientChannelConfig channelConfig) {
    // 删除某个类型下的通道列表
    CacheClient.remove(keyUtil.getGroupKey(
        ".clientId." + channelConfig.getClientId() + ".type." + channelConfig.getType()));
    CacheClient.remove(keyUtil.getRecKey(".clientId." + channelConfig.getClientId() + ".type."
        + channelConfig.getType() + ".channels"));
    CacheClient.remove(keyUtil.getRecKey(
        ".clientId." + channelConfig.getClientId() + ".type." + channelConfig.getType()));
  }

  public List<ClientChannelConfig> get(long clientId, int type) {
    return CacheClient.get(keyUtil.getRecKey(".clientId." + clientId + ".type." + type),
        new GetCallback<List<ClientChannelConfig>>() {

          @Override
          public String getCacheGroup() {
            // 和通道同一个group，确保在通道有变化的时候失效
            return ChannelService.allChannelGroupKey;
          }

          @Override
          public List<ClientChannelConfig> getObject() {
            return channelConfigDAO.getChannelList(clientId, type);
          }
        });
  }

  public void deleteByClientIdAndType(long clientId, int type) {
    channelConfigDAO.deleteByClientIdAndType(clientId, type);
    ClientChannelConfig channelConfig = new ClientChannelConfig();
    channelConfig.setClientId(clientId);
    channelConfig.setType(type);
    // 删除缓存的列表通道
    deleteClientChannelConfigCache(channelConfig);
  }
}
